Kong KonnectでKong GatewayをEC2にデプロイしLambdaを実行してみる
APIの管理を効率化したい えがわ です。
本ブログはゲーソル・ギョーソル Advent Calendar 2024の3日目のブログとなります。
今回はKong Konnectを使用してEC2にデプロイしたKong Gateway経由でLambdaを実行してみます。
Kongの説明は以下の記事をご確認ください。
構成図
今回の構成図はこちらです。
EC2にKong Gatewayをデプロイし、プラグインを使用してLambdaを実行します。
環境
- Kong Gateway 3.8
- EC2: Amazon Linux 2023
- Lambda: Python 3.13
やってみる
EC2の起動、接続方法については本筋ではないので割愛します。
パブリックサブネットに配置、IPアドレスの付与、そして、以下のセキュリティグループの設定が必要です。
セキュリティグループの設定
Kong GatewayはデフォルトではTCP8000を使用しますので、セキュリティグループのインバウンドルールを許可しておきます。
他の機能を使用する場合はそのポートも許可する必要があります。
こちらより抜粋
IAMロールを作成
EC2からLambdaを呼び出すため、EC2に付与するIAMロールを作成します。
IAMポリシーとしてはlambda:InvokeFunction
を設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ExamplePolicy",
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:*:{ACCOUNT_ID}:function:*"
}
]
}
※{ACCOUNT_ID}
を置き換えてください。
作成したロールをEC2に設定します。
Lambdaを作成
Lambdaを作成していきます。
ランタイムはなんでもいいですが、今回はPython 3.13を使用します。
コードはデフォルトのまま使用します。
import json
def lambda_handler(event, context):
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
Dockerを起動
EC2に接続しDockerを起動します。
# システムの更新
sudo dnf update -y
# Dockerのインストール
sudo dnf install docker -y
# Dockerサービスの起動
sudo systemctl start docker
# システム起動時にDockerを自動起動する設定
sudo systemctl enable docker
# 現在のユーザー(ec2-user)をdockerグループに追加
sudo usermod -aG docker ec2-user
# Dockerバージョンの確認
docker --version
Kong Gatewayを起動
KonnectからKong Gatewayを作成していきます。
Gateway Manager -> New Gateway
を押下します。
Self-Managed Hybrid
を選択し、Nameを入力します。
PlatformでLinux (Docker)
を選択し、Generate Certificate
を押下します。
表示されたdocker run
コマンドを実行します。
※文頭にsudoを付与する必要があります。
EC2でKong Gatewayを起動できました。
Routeを作成
Lambdaを実行するためのRouteを作成します。
Gateway Manager -> Routes -> + New Route
でRouteを作成します。
Nameにはlambda, Pathsにも/lambdaを設定しSave
を押下します。
Routeが作成できました。
Pluginの設定
Routeの画面からPlugins
をクリックします。+ New Plugin
を押下します。
検索窓にLambda
を入力し、AWS Lambda
プラグインを選択します。
プラグインの設定画面が表示されるので、
View Advanced Parameters
をクリックし、以下の設定を入力します。
項目名 | 設定値 |
---|---|
AWS Region | ap-northeast-1 |
Function Name | kong-demo-lambda |
プラグインが設定できました。
実行してみる
EC2のパブリックIPにリクエストしてみます。
egawa@HL01559:~$ curl -i http://{xxx.xxx.xxx.xxx}:8000/lambda
HTTP/1.1 200 OK
Content-Type: application/json
Connection: keep-alive
Via: 2 kong/3.8.0.0-enterprise-edition
X-Amz-Executed-Version: $LATEST
x-amzn-Remapped-Content-Length: 0
X-Amzn-Trace-Id: Root=1-674d5021-411b76555c2d1b3b58a153e5;Parent=4cce7f3c3accdcea;Sampled=0;Lineage=1:de65a904:0
X-Amz-Log-Result: U1RBUlQgUmVxdWVzdElkOiAwYjBiY2VjYy05ZmVkLTQwOTctYjViNy1kYjg2ZDEzZDhhOWMgVmVyc2lvbjogJExBVEVTVApFTkQgUmVxdWVzdElkOiAwYjBiY2VjYy05ZmVkLTQwOTctYjViNy1kYjg2ZDEzZDhhOWMKUkVQT1JUIFJlcXVlc3RJZDogMGIwYmNlY2MtOWZlZC00MDk3LWI1YjctZGI4NmQxM2Q4YTljCUR1cmF0aW9uOiAxLjY5IG1zCUJpbGxlZCBEdXJhdGlvbjogMiBtcwlNZW1vcnkgU2l6ZTogMTI4IE1CCU1heCBNZW1vcnkgVXNlZDogMzEgTUIJCg==
Date: Mon, 02 Dec 2024 06:13:53 GMT
x-amzn-RequestId: 0b0bcecc-9fed-4097-b5b7-db86d13d8a9c
Content-Length: 50
X-Kong-Response-Latency: 0
Server: kong/3.8.0.0-enterprise-edition
X-Kong-Request-Id: 37206b5ee6baee6eb1878306e6d9445e
{"statusCode":200,"body":"\"Hello from Lambda!\""}
Lambdaを実行することができました。
さいごに
Kong GatewayからLambdaを実行する手順をまとめてみました。
AWSのサービスを使用してKong Gatewayを起動する場合、他のAWSサービスとの連携はシームレスに行えます。
キーやシークレットといった認証情報の管理は必要なく、ロールの管理で完結します。
この記事がどなたかの参考になれば幸いです。